<?php
class ServicesExceptionHandler implements ExceptionHandler
{
	private $notifyLevel;
	private $attached = false;

	/******Singleton******/

	private static $instance = null;

	public static function getInstance()
	{
		if ( self::$instance == null ) {
			self::$instance = new ServicesExceptionHandler();
		}

		return( self::$instance );
	}
	/*********************/


	/**
	 * Devuelve el nivel actual de notificación. Podrá ser
	 * cualquiera de las constantes definidas en la interfaz.
	 */
	public function getNotifyLevel()
	{
		return( $this->notifyLevel );
	}

	/**
	 * Establece el nivel actual de notificación.
	 */
	public function setNotifyLevel( int $errorLevel )
	{
		$this->notifyLevel = $errorLevel;
	}

	/**
	 * Se desencadena cuando se produce una excepción
	 * no controlada en la aplicación.
	 */
	public function exceptionEvent( ServerException $exception )
	{
		Response::setError( $exception );

		$strResp = Response::close();
		echo $exception->getMessage();
		echo( $strResp );

		die;
	}

	/**
	 * Se desencadena cuando se produce un
	 * error no controlado de PHP.
	 */
	public function errorEvent( $errno, $errstr, $errfile, $errline, $errcontext )
	{
		if ( $errno != E_USER_ERROR ) {
			return;
		}

		$error = new UnhandledException(
			null,
			$errstr,
			$errno,
			$errfile,
			$errline
		);

		$this->exceptionEvent( $error );

		die;
	}

	public function attachHandler()
	{
		if ( $this->attached ) {
			return(false);
		}

		$class = ServicesExceptionHandler;

		set_error_handler( array(new $class, "errorEvent") );
		set_exception_handler( array(new $class, "exceptionEvent") );

		$this->attached = true;

		return(true);
	}

	public function dettachHandler()
	{
		if ( !$this->attached ) {
			return(false);
		}

		$class = get_class($this);

		restore_error_handler();
		restore_exception_handler();

		$this->attached = false;

		return(true);
	}

}
?>
